/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controle;

import Entidades.Link;
import Entidades.LocalizadoraLinks;
import Entidades.No;
import java.util.ArrayList;

/**
 *
 * @author Adriano
 */
public class ControleLinks {

    public static void cadastraLinksIDs(int IDorigem, int IDdestino) {
        No origem = Entidades.LocalizadoraDeNos.busca(IDorigem);
        No destino = Entidades.LocalizadoraDeNos.busca(IDdestino);
        double distancia = ControleNos.calculaDistancia(origem, destino);
        Link link = new Link(origem, destino, distancia);
        LocalizadoraLinks.insere(link);
    }

    public static ArrayList getSucessores(No no) {
        ArrayList<No> sucessores = new ArrayList<No>();
        try {
            Link link = null;
            for (int i = 0; i < LocalizadoraLinks.getLista().size(); i++) {
                link = (Link) LocalizadoraLinks.getLista().get(i);
                if (link.getDestino() == no) {
                    sucessores.add(link.getOrigem());
                } else {
                    if (link.getOrigem() == no) {
                        sucessores.add(link.getDestino());
                    }
                }
            }
        } catch (Exception erro) {
            System.out.println("Erro ao buscar sucessores");
            System.out.println(erro.getMessage());
        }
        return sucessores;
    }

    public static double getDistanciaReal(No noA, No noB) {
        Link link = null;
        for (int i = 0; i < LocalizadoraLinks.getLista().size(); i++) {
            link = (Link) LocalizadoraLinks.getLista().get(i);
            if (link.getDestino() == noA && link.getOrigem() == noB) {
                return link.getDistancia();
            } else {
                if (link.getDestino() == noB && link.getOrigem() == noA) {
                    return link.getDistancia();
                }
            }
        }
        return -1;
    }

    public static boolean existeId(int IDorigem, int IDdestino) {
        No noA = Entidades.LocalizadoraDeNos.busca(IDorigem);
        No noB = Entidades.LocalizadoraDeNos.busca(IDdestino);
        if (noA == noB) {
            return true;
        }
        Link link = null;
        for (int i = 0; i < LocalizadoraLinks.getLista().size(); i++) {
            link = (Link) LocalizadoraLinks.getLista().get(i);
            if (link.getDestino() == noA && link.getOrigem() == noB) {
                return true;
            } else {
                if (link.getDestino() == noB && link.getOrigem() == noA) {
                    return true;
                }
            }
        }
        return false;
    }

    public static boolean existeOrigem(No origem, No destino, ArrayList<Link> links) {

        Link link = null;
        for (int i = 0; i < links.size(); i++) {
            link = (Link) links.get(i);
            if ((link.getOrigem() == origem && link.getDestino() != destino) ^ (link.getDestino() == origem && link.getOrigem() != destino)) {
                return true;
            }
        }
        return false;
    }

    public static boolean existeDestino(No destino, No origem, ArrayList<Link> links) {

        Link link = null;
        for (int i = 0; i < links.size(); i++) {
            link = (Link) links.get(i);
            if ((link.getDestino() == destino && link.getOrigem() != origem) ^ (link.getOrigem() == destino && link.getDestino() != origem)) {
                return true;
            }
        }
        return false;
    }

    public static ArrayList getExtremo(ArrayList<Link> roteiro) {
        ArrayList<No> extremos = new ArrayList<No>();
        No x = null;
        int achou = 0;
        if (roteiro.isEmpty()) {
            return null;
        } else {
            //Captura todos os nós e insere no array list
            ArrayList<No> nos = new ArrayList<No>();
            for (int i = 0; i < roteiro.size(); i++) {
                Link l = roteiro.get(i);
                nos.add(l.getOrigem());
                nos.add(l.getDestino());
            }
            for (int i = 0; i < nos.size(); i++) {
                achou = 0;
                for (int j = 0; j < nos.size(); j++) {
                    x = nos.get(i);

                    if (x == nos.get(j)) {
                        achou++;
                    }
                }
                if (achou == 1) {
                    extremos.add(x);
                }
            }

            return extremos;
        }
    }

    public static boolean existeLink(int IDorigem, int IDdestino, ArrayList<Link> links) {
        No noA = Entidades.LocalizadoraDeNos.busca(IDorigem);
        No noB = Entidades.LocalizadoraDeNos.busca(IDdestino);
        if (noA == noB) {
            return true;
        }
        Link link = null;
        for (int i = 0; i < links.size(); i++) {
            link = links.get(i);
            if (link.getDestino() == noA && link.getOrigem() == noB) {
                return true;
            } else {
                if (link.getDestino() == noB && link.getOrigem() == noA) {
                    return true;
                }
            }
        }
        return false;
    }

    public static boolean existeId(int ID) {
        No no = Entidades.LocalizadoraDeNos.busca(ID);
        if (no == null) {
            return false;
        }
        return true;
    }

    public static void removeTodosOsLinksPorNo(int codigo) {
        No no = Entidades.LocalizadoraDeNos.busca(codigo);
        ArrayList<Link> links = getTodosLinksPorNo(no);
        LocalizadoraLinks.getLista().removeAll(links);
    }

    public static void excluiLink(int idA, int idB) {
        Link link = null;
        for (int i = 0; i < LocalizadoraLinks.getLista().size(); i++) {
            link = (Link) LocalizadoraLinks.getLista().get(i);
            if (link.getDestino().getIdentificador() == idA && link.getOrigem().getIdentificador() == idB) {
                LocalizadoraLinks.getLista().remove(link);
            } else {
                if (link.getDestino().getIdentificador() == idB && link.getOrigem().getIdentificador() == idA) {
                    LocalizadoraLinks.getLista().remove(link);
                }
            }
        }
    }

    private static ArrayList<Link> getTodosLinksPorNo(No no) {
        ArrayList<Link> v = new ArrayList<Link>();
        Link link = null;
        for (int i = 0; i < LocalizadoraLinks.getLista().size(); i++) {
            link =  LocalizadoraLinks.getLista().get(i);
            if (link.getDestino() == no) {
                v.add(link);
            } else {
                if (link.getOrigem() == no) {
                    v.add(link);
                }
            }
        }
        return v;
    }

    public static void listaTodosLinks() {
        Link link = null;
        for (int i = 0; i < LocalizadoraLinks.getLista().size(); i++) {
            link = (Link) LocalizadoraLinks.getLista().get(i);
            System.out.println(link.getOrigem().getIdentificador() + " - " + link.getDestino().getIdentificador());
        }
    }

    public static ArrayList<Link> getLinksByNo(No no) {
        ArrayList<Link> linksNo = new ArrayList<Link>();

        Link link = null;
        ArrayList<Link> links = getTodosLinks();
        for (int i = 0; i < links.size(); i++) {
            link = (Link) links.get(i);

//            if ((link.getOrigem() == no) || (link.getDestino() == no)) {
//                linksNo.add(link);
//            }
            if ((link.getOrigem() == no)) {
                linksNo.add(link);
            }

        }
        return linksNo;
    }

    public static Link getLink(No noA, No noB, ArrayList<Link> links) {
        for (Link link : links) {

            if (((link.getOrigem() == noA) && (link.getDestino() == noB)) || ((link.getOrigem() == noB) && (link.getDestino() == noA))) {
                return link;
            }

        }
        return null;
    }

    public static ArrayList<Link> getTodosLinks() {
        Link link = null;
        ArrayList<Link> v = LocalizadoraLinks.getLista();
        return v;
    }
}
